package com.scqkxx.gamebox;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;
import android.util.Log;

import com.avos.avoscloud.AVOSCloud;
import com.baidu.mobstat.StatService;
import com.igexin.sdk.PushManager;
import com.meituan.android.walle.WalleChannelReader;
import com.scqkxx.gamebox.receiver.IntentService;
import com.scqkxx.gamebox.receiver.PushReceiver;
import com.scqkzqtz.base.library.utils.PreferenceUtils;
import com.scqkzqtz.base.refresh.BaseRefreshHeader;
import com.scqkzqtz.basesdk.initializationUtils;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshInitializer;
import com.scwang.smartrefresh.layout.api.RefreshFooter;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.tencent.smtt.sdk.QbSdk;
import com.tendcloud.tenddata.TCAgent;

import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import io.realm.Realm;
import io.realm.RealmConfiguration;


/**
 * Created by zsx on 2018/7/27.
 */

public class AppApplication extends MultiDexApplication {

    //static 代码段可以防止内存泄露
    static {
        //设置全局默认配置（优先级最低，会被其他设置覆盖）
        SmartRefreshLayout.setDefaultRefreshInitializer(new DefaultRefreshInitializer() {
            @Override
            public void initialize(@NonNull Context context, @NonNull RefreshLayout layout) {
                //开始设置全局的基本参数（可以被下面的DefaultRefreshHeaderCreator覆盖）
                layout.finishRefresh(10000);//延迟  毫秒后结束刷新
                layout.finishLoadMore(10000);//延迟  毫秒后结束加载
            }
        });

        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
            @Override
            public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
                return new BaseRefreshHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header，默认是 贝塞尔雷达Header
            }
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
            @Override
            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                layout.finishLoadMore(10000);//延迟3000毫秒后结束加载
                //指定为经典Footer，默认是 BallPulseFooter
                return new ClassicsFooter(context).setDrawableSize(20);
            }
        });
    }

    @Override
    public void onCreate() {
        super.onCreate();
        init();
        AVOSCloud.setDebugLogEnabled(false);
        Single.just(true).map(res -> initWebview())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe();
    }

    private void init() {
        initializationUtils.init(this);
        PreferenceUtils.init(this);
        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder().build();
        Realm.setDefaultConfiguration(config);

        // 自动埋点，建议在Application中调用。否则可能造成部分页面遗漏，无法完整统计。
        // @param autoTrace：如果设置为true，打开自动埋点；反之关闭
        // @param autoTrackWebview：
        // 如果设置为true，则自动track所有webview，如果有对webview绑定WebChromeClient，
        // 为避免影响APP本身回调，请调用trackWebView接口；
        // 如果设置为false，则不自动track webview，如需对特定webview进行统计，需要对特定
        // webview调用trackWebView()即可。
        StatService.autoTrace(this, true, true);
        StatService.setAppChannel(this, WalleChannelReader.getChannel(this.getApplicationContext()), true);

        TCAgent.LOG_ON = true;
        // App ID: 在TalkingData创建应用后，进入数据报表页中，在“系统设置”-“编辑应用”页面里查看App ID。
        // 渠道 ID: 是渠道标识符，可通过不同渠道单独追踪数据。
        TCAgent.init(this, "ED9D8EE4007144E1860B7E218A529204", WalleChannelReader.getChannel(this.getApplicationContext()));
        // 如果已经在AndroidManifest.xml配置了App ID和渠道ID，调用TCAgent.init(this)即可；或与AndroidManifest.xml中的对应参数保持一致。
        TCAgent.setReportUncaughtExceptions(true);

        //个推
        // 第三方自定义推送服务
        PushManager.getInstance().initialize(this.getApplicationContext(), PushReceiver.class);
//        // 第三方自定义的推送服务事件接收类
        PushManager.getInstance().registerPushIntentService(this.getApplicationContext(), IntentService.class);
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    private boolean initWebview() {
        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

            @Override
            public void onViewInitFinished(boolean arg0) {
                // TODO Auto-generated method stub
                //x5內核初始化完成的回调，为true表示x5内核加载成功，否则表示x5内核加载失败，会自动切换到系统内核。
                Log.d("app", " onViewInitFinished is " + arg0);
            }

            @Override
            public void onCoreInitFinished() {
                // TODO Auto-generated method stub
                Log.d("app", " onCoreInitFinished");
            }
        };
        //x5内核初始化接口
        QbSdk.initX5Environment(getApplicationContext(), cb);
        return true;
    }
}
